package com.sh.rbac.core.security.util;

import com.sh.rbac.core.common.enums.UserTypeEnum;
import com.sh.rbac.domain.entity.Role;
import com.sh.rbac.domain.entity.User;
import org.springframework.security.core.context.SecurityContextHolder;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 当前用户信息工具类
 *
 * @author wb
 * @since 2024-07-17
 */
public class SecurityHolderUtils {


    /**
     * 获取当前登录用户信息
     *
     * @return 当前登录用户信息
     */
    public static User getLoginUser() {
        return (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }


    /**
     * 获取当前登录用户ID
     *
     * @return 当前登录用户ID
     */
    public static Long getUserId() {
        return getLoginUser().getId();
    }

    /**
     * 获取当前登录用户名称
     *
     * @return 当前登录用户名称
     */
    public static String getUsername() {
        return getLoginUser().getUsername();
    }

    /**
     * 判断当前用户是否是超级管理员
     *
     * @return true:是超级管理员 false:普通用户
     */
    public static Boolean isAdmin() {
        return UserTypeEnum.isAdmin(getLoginUser().getUsertype());
    }

    /**
     * 获取当前用户角色ID
     *
     * @return 角色ID集合
     */
    public static List<Long> getRoleIds() {
        return getLoginUser().getRoles().stream().map(Role::getId).toList();
    }


    /**
     * 获取当前用户数据权限
     *
     * @return 数据权限
     */
    public static Set<Integer> getDataScopes() {
        Set<Integer> dataScopes = new HashSet<>();
        Set<Role> roles = getLoginUser().getRoles();
        if (roles != null) {
            roles.forEach(role -> {
                if (role.getDataScope() != null) {
                    dataScopes.add(role.getDataScope());
                }
            });
        }

        return dataScopes;
    }

    /**
     * 获取数据权限部门ID
     *
     * @return 部门ID集合
     */
    public static Set<Long> getDataScopeDeptIds() {
        Set<Long> dataScopeDeptIds = new HashSet<>();
        Set<Role> roles = getLoginUser().getRoles();
        if (roles != null) {
            roles.forEach(role -> {
                if (role.getDataScopeDeptIds() != null) {
                    dataScopeDeptIds.addAll(Arrays.stream(role.getDataScopeDeptIds().split(",")).map(Long::parseLong).toList());
                }
            });
        }

        return dataScopeDeptIds;
    }
}
